package _11_整理题目._4_动态规划._模拟;

import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;

/**
 * 本质是一个 二维的最长递增子序列问题
 * 给你一个二维整数数组 envelopes ，其中 envelopes[i] = [wi, hi] ，表示第 i 个信封的宽度和高度。
 * 当另一个信封的宽度和高度都比这个信封大的时候，这个信封就可以放进另一个信封里，如同俄罗斯套娃一样。
 * 请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封（即可以把一个信封放到另一个信封里面）。
 * 注意：不允许旋转信封。
 * 
 * 先将二维数组排序：按照 wi 增序排，如果 wi 相等，则按 hi 降序
 * 
 */
public class _11_俄罗斯套娃信封问题 {
    
    public int maxEnvelopes(int[][] envelopes) {
        if (envelopes==null || envelopes.length==0) return 0;
        Arrays.sort(envelopes, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[0] != o2[0]) {
                    return o1[0]-o2[0];
                } else {
                    return o2[1]-o1[1];
                }
            }
        });
        
        int n = envelopes.length;
        int[] dp = new int[n];
        Arrays.fill(dp, 1);
        
        int max = 1;
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (envelopes[i][1] > envelopes[j][1]) {
                    dp[i] = Math.max(dp[i], dp[j]+1);
                }
            }
            max = Math.max(max, dp[i]);
        }
        return max;
    }
    
    @Test
    public void main() {
        int[][] envelopes = {
                {5,4},
                {6,4},
                {6,7},
                {2,3},
        };
        System.out.println(maxEnvelopes(envelopes));
        assert maxEnvelopes(envelopes) == 3;
    }
}
